package procimagem;

public class RobertsCruzado implements Aplicavel {

	private ImagemPGM imagem;

	private ImagemPGM imagemFixa;

	public RobertsCruzado(ImagemPGM image) {
		int[][] pixels = new int[image.largura][image.altura];
		int[][] matriz = new int[image.largura][image.altura];
		for (int i = 0; i < matriz.length; i++) {
			for (int j = 0; j < matriz[i].length; j++) {
				pixels[i][j] = image.pixels[i][j];
				matriz[i][j] = image.pixels[i][j];
			}
		}
		this.imagem = new ImagemPGM(image.largura, image.altura,
				image.maxValue, pixels);
		this.imagemFixa = new ImagemPGM(image.largura, image.altura,
				image.maxValue, matriz);
	}

	public void aplica() {
		for (int i = 0; i < imagemFixa.largura; i++) {
			for (int j = 0; j < imagemFixa.altura; j++) {
				aplicaNoPixel(i, j);
			}
		}
	}

	public void aplicaNoPixel(int x, int y) {
		int fatA = 0;
		int fatB = 0;

		if (((y + 1) < imagemFixa.altura) && ((x + 1) < imagemFixa.altura)) {
			fatB = imagemFixa.pixels[x][y] - imagemFixa.pixels[x + 1][y + 1];
		} else {
			fatB = imagemFixa.pixels[x][y];
		}

		if ((x + 1) < imagemFixa.largura) {
			fatA += imagemFixa.pixels[x + 1][y];
		}
		if ((y + 1) < imagemFixa.altura) {
			fatA += -imagemFixa.pixels[x][y + 1];
		}

		int mag = Math.abs(fatB) + Math.abs(fatA);

		imagem.pixels[x][y] = mag;

	}

	public ImagemPGM getImage() {
		return this.imagemFixa;
	}

	public ImagemPGM getModifiedImage() {
		return this.imagem;
	}

}
